package com.syf.core.kit.resource;

/**
 * kit工具类的资源（io资源或其他）委托管理器，因为很多kit的资源需要在特定的业务执行过程才能释放。因此，它的释放动作需要委托给service actuator.
 * 但是，service actuator与kit是解耦合的。为此，我们然后kit自己实现ResourceReleaser，然后通过ThreadLocal存储。
 * service actuator从ThreadLocal找到资源，然后释放资源，然后删除ThreadLocal
 *  * 这是一个工具类，kit要自己实例化此对象，以便kit内将已分配的资源委托给service actuator。
 */
public class ResourceDelegator<T extends DelegatedResource> {
    private String resourceName;

    public ResourceDelegator(String resourceName) {
        this.resourceName = resourceName;
        KitResourceReleaseController.registerResourceReleaser(resourceName);
    }

    /**
     * 委托要释放的资源
     */
    public void delegateResource(T t) {
        KitResourceReleaseController.getThreadLocal(resourceName).set(t);
    }

    /**
     * 取消委托
     */
    public void cancel() {
        KitResourceReleaseController.getThreadLocal(resourceName).remove();
    }

    /**
     * 获取委托的资源
     */
    public T getResource() {
        return (T) KitResourceReleaseController.getThreadLocal(resourceName).get();
    }

    /**
     * 本线程是否已经委托
     */
    public boolean isDelegate() {
        return KitResourceReleaseController.getThreadLocal(resourceName).get() == null ? false : true;
    }
}
